// 不用泛型的话，这个函数可能是下面这样：
function identity(age:number):number{
    return age
}
//传入的类型与返回的类型应该是相同的。如果我们传入一个数字，我们只知道任何类型的值都有可能被返回
function identity1(arg: any): any {
    return arg;
}

//添加个类型T 帮助我们捕获用户传入的类型   之后就可以使用这个类型 作为返回值
function identity2<T>(arg: T): T {
    return arg;
}

identity2('21354')

// 类型 t 可以是任意类型

// 若是数字类型  没有 .length  会出现报错 
// function loggingIdentity<T>(arg: T): T {
//     console.log(arg.length);  // Error: T doesn't have .length
//     return arg;
// }

function loggingIdentity1 <G> ( age: G[] ) : G[]{
    console.log(age.length);
    return age
}
// 等同于
function loggingIdentity<T>(arg: Array<T>): Array<T> {
    console.log(arg.length);  // Array has a .length, so no more error
    return arg;
}

loggingIdentity([5164])
loggingIdentity(['5164'])

// loggingIdentity1(15123)  //类型“number”的参数不能赋给类型“unknown[]”的参数
loggingIdentity1([5164])
loggingIdentity1(['5164'])


function identity3<T>(arg: T): T {
    return arg;
}

let myIdentity: <T>(arg: T) => T = identity3;